package red;

import java.io.IOException;
import arjuna.JavaSim.Simulation.RestartException;
import arjuna.JavaSim.Simulation.SimulationException;
import arjuna.JavaSim.Simulation.SimulationProcess;
import arjuna.JavaSim.Distributions.ExponentialStream;
import arjuna.JavaSim.Distributions.UniformStream;
//import java.util.Random;
public class Arrivals extends SimulationProcess {
    private ExponentialStream intervaloLlegada;//media de peticiones por segundo     
    private int     nodos;
    public static int mut=3;
    private UniformStream NodoInicial;
    private UniformStream NodoFinal;
    
    //private double InterArrivalTime;
   

    public Arrivals (double peticiones,int seed,int Nnodos ) {
           nodos = Nnodos;
             if(Nnodos!=0)
                {
            	 ////////////,EN ESE APARTADO HAY QUE PONER LA MEDIA
                    intervaloLlegada = new ExponentialStream((1/(peticiones)),1);//devuelve nùmero de una distribución exponencial con la media dada
                    //seed en este caso representa el número de la secuencia aleatoria seleccionada(o primer número de la serie)
                    //que utiliza un generador para crear toda la serie,podemos dar varias secuencias diferentes
                    //ExponentialStream(double media,int StreamSelect)
                }
             double numNodo;
             numNodo=(double)Nnodos;
             NodoInicial = new UniformStream(0.0,numNodo,1);//UniformStream (double lo, double hi, int StreamSelect)
             NodoFinal= new UniformStream(0.0,numNodo,1);//limites de 0 a 10, tendria que cambiar 10 x  nodos por lo tanto pasar int a double
             
        }
       
   

    public void run () {//creo numeros aleatorios para crear peticiones a nodos inicio i fin
        for (;;) {

            try {   
                    int nodoIni,nodoFin;
                    double d;
                    d = intervaloLlegada.getNumber()	;//getnumber devuelve numero aleatorio//dependera del tiempo de peticiones por seg.que.
                    Hold((d));//d es el tiempo hasta la nueva comprobación ,activo asta planific
                    
                    do{
                        d=NodoInicial.getNumber();
                        nodoIni= (int) Math.floor(d);
                        
                    }while(MachineShop.servidor[nodoIni].getPetitionActivate()==true);
                   //Y LA LISTA ESTE VACIA// 
                    do {
                         d=NodoFinal.getNumber();
                         nodoFin=(int) Math.floor(d);
                     } while (nodoIni==nodoFin);              
                    Job work = new Job(nodoIni,nodoFin);
                    //aquí lo que hace es enviarlo a todos menos a el mismo
//                    
                    for(int i =0 ;  i<nodos ; i++)
                        {
                            if(i!=work.getCliente())
                    		if(i != nodoIni)
                            {
                                MachineShop.servidor[i].Request(work);
                            }
                        }
                 }       
          
            catch (SimulationException e) {}
            catch (RestartException e) {}
            catch (IOException e) {}
        }
    }
}